package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @ClassName Reflection
 * @PackageName reflection
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/8/29 上午11:31
 * @Version 1.0
 */
public class ReflectionExample {

    /**
     * 框架开发：如Spring的依赖注入、ORM框架等
     * 序列化/反序列化：如JSON解析库
     * 动态代理：如JDK动态代理
     * 配置文件解析：通过配置创建对象实例
     * 单元测试：访问私有方法和字段进行测试
     * @param args
     * @throws NoSuchMethodException
     * @throws NoSuchFieldException
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException, ClassNotFoundException {
        // 方式一：通过类名.class获取
        Class<?> clazz = String.class;
        System.out.println(clazz);

        // 方式二：通过对象的getClass()方法获取
        String str = "hello";
        Class<?> clazz2 = str.getClass();
        System.out.println(clazz2);

        //方式三：通过Class.forName() 方法获取
        Class<?> clazz3 = Class.forName("java.lang.String");
        System.out.println(clazz3);


        // 获取所有public构造方法
        Constructor<?>[] constructors = clazz.getConstructors();

        // 获取所有构造方法（包括private）
        Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();

        // 获取特定参数类型的构造方法
        Constructor<?> constructor = clazz.getConstructor(String.class, int.class);

        // 获取所有public字段
        Field[] fields = clazz.getFields();

        // 获取所有字段（包括private）
        Field[] declaredFields = clazz.getDeclaredFields();

        // 获取特定名称的字段
        Field field = clazz.getDeclaredField("fieldName");
        // 获取所有public方法
        Method[] methods = clazz.getMethods();

        // 获取所有方法（包括private）
        Method[] declaredMethods = clazz.getDeclaredMethods();

        // 获取特定方法
        Method method = clazz.getDeclaredMethod("methodName", String.class, int.class);

    }
}
